/* 单例模式(Singleton) 是指一个类只有一个实例化对象，实现过程中，采用静态函数和静态成员变量对类进行构造，
    而构造函数修改为私有函数. */

#include <iostream>
#include <memory>

using namespace std;

class Singleton
{
private:
    // 关键静态成员变量
    static  unique_ptr<Singleton> m_self; 

    Singleton();
    Singleton(const Singleton& singleton) = delete;// 禁止拷贝构造函数
    Singleton& operator = (const Singleton& singleton) = delete; // 禁止赋值构造函数

public:
    // 关键静态成员函数，这里将返回的指针类型修改为引用，解决多次实例化后，
    // 在运行阶段时析构函数报错。
    // static Singleton* getInstance();
    static Singleton & getInstance();
    ~Singleton();
};

Singleton::Singleton()
{
    cout<<"Singleton constructor finished."<<endl;
}

Singleton::~Singleton()
{
    cout << "Singleton destructor finished." << endl;
}

unique_ptr<Singleton> Singleton::m_self = nullptr;

Singleton& Singleton::getInstance()
{
    if(!m_self){
        m_self.reset(new Singleton());
    }
    else{
        cout<<"Singleton has instance, will return it."<<endl;
    }

    return *m_self;
}

int main(int argc, char const *argv[])
{
    //多次实例化测试
    Singleton& a = Singleton::getInstance();
    Singleton& b = Singleton::getInstance();
    Singleton& c = Singleton::getInstance();
    Singleton& d = Singleton::getInstance();
    
    return 0;
}
